package structure.map;

import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Set;

import org.junit.Test;

/**
 * 哈希映射扩容演示
 * @author fidel
 */
public class HashMapResizeDemo {
    private static HashMap<Key, Object> map = new HashMap<>();

    @Test
    public void test() {
        /*
         * 此哈希映射的默认容量是16，默认扩容阈值是0.75，即默认元素数据最大长度为16×0.75=12
         * 此哈希映射的第一次扩容发生在置入第13个元素时
         */
        int a = 65;
        for (int b = 0; b < 26; b++) {
            // 多个元素落在同一哈希桶中会形成有序集合
            map.put(new Key(), (char) a);
            a++;
        }
        System.out.println(map.size());
        System.out.println(map.get(new Key()));
        Set<Entry<Key, Object>> entrySet = map.entrySet();
        for (Entry<Key, Object> entry : entrySet) {
            System.out.println(entry.getKey() + "，" + entry.getValue());
        }
    }

    /**
     * 哈希码值相同但与其他对象不相等的对象的类。
     * <p>当哈希集合放入哈希码值相同，但又互不相等的元素后，无论这些元素是作为单独的entry，
     * 还是作为键与其对应的值组成的entry，这些entry都将存储至一个哈希桶中，不会相互覆盖。
     * @author fidel
     */
    private class Key {
        /**
         * 令该类对象的哈希码值等于同一个常数。
         * <p>若两个对象的哈希码值相同，它们与哈希集合表的长度进行位运算的结果也必定相同，存放在哈希集合表上的槽也相同。
         */
        @Override
        public int hashCode() {
            return 1;
        }

        /**
         * 令该类对象与其他任何对象不相等。
         * @see HashMap#putVal(int, Object, Object, boolean, boolean)
         */
        @Override
        public boolean equals(Object obj) {
            return false;
        }
    }
}
